package com.xlkj.ms.tools.aop.annotations;

import com.alibaba.fastjson.serializer.SerializerFeature;
import org.springframework.core.annotation.AliasFor;

import javax.validation.GroupSequence;
import javax.validation.groups.Default;
import java.lang.annotation.*;

/**
 * 微服务注解(用于接口方法中)
 * @author zhuqifeng
 * @date 2021/11/10 14:04
 * @package com.xlkj.ms.tools.aop.annotations
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MicroService {

	/** 返回类如果不传，那么将按照接口真实返回类型处理 */
	@Deprecated
	Class<?> clazz() default Class.class;

	/** 操作名称（如果不配置，那么操作名就是class+method。如：com.hikvision.test.ms.PeopleServiceImpl.query） */
	@AliasFor("value")
	String operCode() default "";

	/**
	 * @see MicroService#operCode()
	 * @return
	 */
	@AliasFor("operCode")
	String value() default "";

	/**
	 * 是否需要校验参数（默认需要）
	 * @return
	 */
	boolean needValidParams() default true;

	/**
	 * 参数校验分组
	 * 默认是参数校验的默认分组{@link Default}，也可以指定多个分组，但这个分组是<strong>无序</strong>的,
	 * 如果想实现有序分组校验，那么可以使用@{@link GroupSequence},例如：
	 * <pre>{@code
	 * 	@ GroupSequence({Default.class, First.class, Second.class, Third.class})
	 * 	public interface OrderedChecks {
	 * 	}
	 * }</pre>
	 * 那么这时候就将OrderedChecks.class作为组传递进来就可以
	 * @return
	 */
	Class<?>[] validateGroups() default Default.class;

	/** 打印请求报文（默认打印,debug或者允许打印的时候才打印） */
	boolean printRequest() default true;

	/** 打印响应报文（默认打印,debug或者允许打印的时候才打印,不允许打印的时候，只会打印耗时） */
	boolean printResponse() default true;

	/**
	 * 用fastjson打印对象的时候，可能会引起循环引用，出现$ref的情况。默认是禁止循环引用
	 * @see SerializerFeature
	 * @return
	 */
	SerializerFeature[] serializerFeature() default {SerializerFeature.DisableCircularReferenceDetect,SerializerFeature.IgnoreErrorGetter};

	/***控制是否打印请求参数或者返回参数，默认打印，之后再根据 printRequest和 printResponse 打印相应的 请求和返回报文 */
	boolean printParams() default  true;
}
